package MDVRPTW;

import java.util.ArrayList;

public class Population {

	private ArrayList<Solution> paretoSet=new ArrayList<Solution>();

	public ArrayList<Solution> getParetoSet() {
		return paretoSet;
	}
	//判断是否为新方案，由于逐个比较路径的客户是否相同难度大，改为判断四个目标值是否相同，如果四个不同，必为两个方案，如果相同，则进一步判断
	//进一步判断方法为，寻找相同的染色体数，如果恰好等于方案中当前染色体数，则认为是相同的
	private boolean isCoincide(Solution a, Solution b) {
		if(a.getTimeVariance()==b.getTimeVariance()&&a.getTotalCars()==b.getTotalCars()&&a.getTotalDistance()==b.getTotalDistance()&&a.getTotalVoilation()==b.getTotalVoilation()){
			int size=a.getTotalCars();
			int count=0;
			for(int i=0;i<size;i++){
				for(int j=0;j<size;j++){
					boolean flag=true;
					if(a.getCars().get(i).getDno()==b.getCars().get(j).getDno()&&a.getCars().get(i).getRoute().size()==b.getCars().get(j).getRoute().size()){
						for(int k=0;k<a.getCars().get(i).getRoute().size();k++){
							if(a.getCars().get(i).getRoute().get(k).getNum() != b.getCars().get(j).getRoute().get(k).getNum()){
								flag=false;
								break;
							}
						}
						if(flag){
							count++;
						}
					}
				}
			}
			if(count==size)
				return true;
			else
				return false;
		}
		else{
			return false;
		}
	}
//	private boolean isCoincide(Solution a, Solution b) {
//		boolean flag=false;
//		if (a.getCars().size() == b.getCars().size()) {
//			int size = a.getCars().size();
//			for (int i = 0; i < size; i++)
//				for(int j=0;j<size;j++){
//					if (a.getCars().get(i).getRoute().size() == b.getCars().get(j).getRoute().size()&&a.getCars().get(i).getDno()==b.getCars().get(j).getDno()) {
//						int num = a.getCars().get(i).getRoute().size();
//						for (int k = 0; k < num; k++)
//							if (a.getCars().get(i).getRoute().get(k).getNum() == b.getCars().get(j).getRoute().get(k).getNum())
//								return false;
//					}				
//				}
//		}
//		return flag;
	//判断两个方案的优劣
	protected int campare(Solution a, Solution b) {
		int result1, result2;
		result1 = 0;
		result2 = 0;
		if (a.getTotalCars() < b.getTotalCars()) {
			result1++;
		} else if (a.getTotalCars() > b.getTotalCars()) {
			result2++;
		}
		if (a.getTimeVariance() > b.getTimeVariance()) {
			result1++;
		} else if (a.getTimeVariance() < b.getTimeVariance()) {
			result2++;
		}
		if (a.getTotalDistance() < b.getTotalDistance()) {
			result1++;
		} else if (a.getTotalDistance() > b.getTotalDistance()) {
			result2++;
		}
		if (a.getTotalVoilation() < b.getTotalVoilation()) {
			result1++;
		} else if (a.getTotalVoilation() > b.getTotalVoilation()) {
			result2++;
		}
		if ((result1 > 0) && (result2 == 0)) {
			return 1;
		} else if ((result2 > 0) && (result1 == 0)) {
			return -1;
		} else {
			return 0;
		}
	}
	
	//更新种群的方法
	protected void updatePareto(Solution s){
		ArrayList<Solution> newPareto=new ArrayList<Solution>();
		Solution temp;
		int size;
		newPareto.add(s);
		size = this.paretoSet.size();
		for (int i = 0; i < size; i++) {
			temp = this.paretoSet.get(i);
			if (this.campare(s, temp) == 0 && !this.isCoincide(s, temp)) {
				newPareto.add(temp);
			}
		}
		this.paretoSet = newPareto;
	}
	
}
